package com.mintrust.repository.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;


/**
 * Created by jucun.zhao on 2017/5/13.
 */
@Configuration
@EnableTransactionManagement
/*@PropertySource({
        "classpath:config/config.properties"
       // ,"classpath:config/database.properties" //如果是相同的key，则最后一个起作用
})*/
//@PropertySource(value = {"${encrypt.file}"})
public class DruidConfiguration {

    @Autowired
    private Environment env;

    //destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
    @Bean(initMethod = "init", destroyMethod = "close")
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
        dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setMinIdle(10);                          //配置初始化大小、最小、最大
        dataSource.setMaxActive(200);                       //配置初始化大小、最小、最大
        dataSource.setInitialSize(10);                      //配置初始化大小、最小、最大
        dataSource.setMaxWait(60000);                       //配置获取连接等待超时的时间
        dataSource.setMinEvictableIdleTimeMillis(300000);   //配置一个连接在池中最小生存的时间,单位是毫秒
        dataSource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        dataSource.setValidationQuery("SELECT 1");          //默认的testWhileIdle=true,testOnBorrow=false,testOnReturn=false

        dataSource.setTestOnBorrow(false);//申请连接时执行validationQuery检测连接是否有效
        dataSource.setTestWhileIdle(true);//建议配置为true，不影响性能，并且保证安全性。
        dataSource.setPoolPreparedStatements(false);//是否缓存preparedStatement，也就是PSCache
        return dataSource;
    }

}

